package game.jrogue;

public class Armour {
    
	
	/**
     * Calculates the armour of a given being
     * vs. a specified damage type
     * 
     * @param t The Thing for which to calculate armour
     * @param dt The type of damage, e.g. "충격"
     * @return
     */
    public static int calcArmour(Thing t, String dt) {
        // no armour vs. speial damage
        if (dt.equals(RPG.DT_SPECIAL)) return 0;
        
        // base armour
        double arm=t.getStat("ARM");
        
        // defece bonus
        int dskill=t.getStat(Skill.DEFENCE);
        
        // small natural bonus for defence skill based on TG
        arm=arm+t.getStat("TG")*(0.1+dskill*0.05);
        
        Thing[] ws=t.getWielded();
        double armourBonus=0;
        for (int i=0; i<ws.length; i++) {
        	double armour=ws[i].getStat("방어력");
        	if (ws[i].getFlag("IsBlessed")) armour*=1.3;
        	if (ws[i].getFlag("IsCursed")) armour*=0.7;
        	armourBonus+=armour;
        }
		
		// armour bonus modified by defence skill
        arm+=armourBonus * (0.6+0.2*dskill);
        
        if (dt.equals(RPG.DT_NORMAL)) {
            // OK - this is default
        } else if (dt.equals(RPG.DT_PIERCING)) {
            arm=arm/3;
        } else if (dt.equals(RPG.DT_ACID)) {
            arm=arm/2;
        } else if (dt.equals(RPG.DT_UNARMED)) {
            arm=arm*2;
        } else {
        	// low armour vs. other attack types
            arm=arm/4;
        }
        
        // Damage specific armour bonuses
        double adtbonus=0;
        for (int i=0; i<ws.length; i++) {
        	adtbonus+=ws[i].getStat("Armour:"+dt);
        }
        arm+=adtbonus * (0.6+0.2*dskill)/ 2.0;
        
        arm=arm+t.getStat("ARM:"+dt);
        return (int)Math.round(arm);
    }
    
    public static String statString(Thing armour) {
    	String s="";
    	if (armour.getFlag("IsShield")) {
    		s=s+"[* * +"+armour.getStat(RPG.ST_DSKMULTIPLIER)/10+"] ";
    	}
    	s=s+ "{arm:"+armour.getStat("방어력")+"}";
    	return s;
    }
    
    public static void init() {
        Thing t = Lib.extend("기본 방어구", "기본 물건");
        t.set("이미지", 340);
        t.set("IsArmour", 1);
        t.set("장비종류", RPG.WT_TORSO);
        t.set("HPS", 70);
        t.set("아이템무게", 20000);
        t.set("기본가격",100);
        t.set("빈도", 50);
        t.set("RES:acid",-12);
        t.set("DamageLevels",2);
        t.set("DefaultThings","5% [IsArmourRune]");
        t.set("아스키코드","[");
        Lib.add(t);
        
        initHeadgear();
        initFootwear();
        initShields();
        initLeatherArmour();
        initGloves();
        initCloaks();
        initStandardArmour();

    }
    
    private static void initCloaks() {
    	Thing t;
    	
    	t=Lib.extend("기본 망토","기본 방어구");
    	t.set("IsCloak",1);
    	t.set("장비종류",RPG.WT_CLOAK);
    	t.set("최소레벨",1);
    	t.set("아이템무게",800);
    	t.set("이미지",356);
    	t.multiplyStat("빈도",0.8);
    	Lib.add(t);
    	
    	t=Lib.extend("얇은 망토","기본 망토");
    	t.set("방어력",0);
    	t.set("최소레벨",1);
    	Lib.add(t);
    	
    	t=Lib.extend("망토","기본 망토");
    	t.set("방어력",1);
    	t.set("최소레벨",3);
    	t.set("아이템무게",1200);
    	Lib.add(t);
    	
    	t=Lib.extend("두꺼운 망토","기본 망토");
    	t.set("방어력",2);
    	t.set("최소레벨",7);
    	t.set("아이템무게",2000);
    	Lib.add(t);
    	
    	t=Lib.extend("우아한 망토","기본 망토");
    	t.set("방어력",3);
    	t.set("최소레벨",9);
    	Lib.add(t);
    	
    	t=Lib.extend("은신의 망토","망토");
    	t.set("식별안된이름","dark cloak");
    	t.set("방어력",1);
    	t.set("최소레벨",6);
    	t.add("장비수정치",Modifier.bonus(Skill.STEALTH,1));
    	Lib.add(t);
    	
    	t=Lib.extend("보호의 망토","두꺼운 망토");
    	t.set("식별안된이름","두꺼운 망토");
    	t.set("방어력",5);
    	t.set("최소레벨",10);
    	Lib.add(t);
    	
    	t=Lib.extend("방어의 망토","망토");
    	t.set("식별안된이름","ragged cloak");
    	t.set("방어력",3);
    	t.set("최소레벨",15);
    	t.add("장비수정치",Modifier.bonus(Skill.DEFENCE,1));

    	Lib.add(t);
    }
    
    private static void initGloves() {
    	Thing t;
    	
    	t=Lib.extend("기본 장갑","기본 방어구");
    	t.set("IsGlove",1);
    	t.set("NameType",Thing.NAMETYPE_QUANTITY);
    	t.set("장비종류",RPG.WT_HANDS);
    	t.set("최소레벨",1);
    	t.set("아이템무게",500);
    	t.set("이미지",370);
    	t.multiplyStat("빈도",0.5);
    	Lib.add(t);
    	
    	t=Lib.extend("가죽 장갑","기본 장갑");
    	t.set("방어력",1);
    	t.set("최소레벨",3);
    	Lib.add(t);
    	
    	t=Lib.extend("부드러운 장갑","기본 장갑");
    	t.set("방어력",0);
    	t.set("최소레벨",1);
    	Lib.add(t);
    	
    	t=Lib.extend("소매치기 장갑","부드러운 장갑");
    	t.set("식별안된이름","부드러운 장갑");
    	t.multiplyStat("빈도",0.2);
        t.add("장비수정치",Modifier.bonus(Skill.PICKPOCKET,1));
        t.add("장비수정치",Modifier.bonus("SK",2));
    	t.set("최소레벨",10);
    	Lib.add(t);
    	
    	t=Lib.extend("두꺼운 가죽 장갑","기본 장갑");
    	t.set("방어력",2);
    	t.set("최소레벨",6);
    	t.set("아이템무게",800);
    	Lib.add(t);
    	
    	t=Lib.extend("가죽 손보호구","기본 장갑");
    	t.set("방어력",3);
    	t.set("최소레벨",9);
    	t.set("아이템무게",900);
    	Lib.add(t);
    	
    	t=Lib.extend("힘의 손보호구","가죽 손보호구");
    	t.set("방어력",4);
    	t.set("최소레벨",12);
    	t.set("아이템무게",900);
    	t.multiplyStat("빈도",0.2);
        t.add("장비수정치",Modifier.bonus("ST",RPG.d(3)));
    	Lib.add(t);
    	
    	t=Lib.extend("보호의 손보호구","가죽 손보호구");
    	t.set("식별안된이름","가죽 손보호구");
    	t.set("방어력",10);
    	t.set("최소레벨",14);
    	t.set("아이템무게",1000);
    	t.multiplyStat("빈도",0.2);
        t.add("장비수정치",Modifier.bonus(Skill.DEFENCE,1));
    	Lib.add(t);
    	
    	t=Lib.extend("붉은 가죽 손보호구","가죽 손보호구");
    	t.set("식별안된이름","가죽 손보호구");
    	t.set("이미지",371);
    	t.set("방어력",5);
    	t.set("최소레벨",16);
    	t.set("아이템무게",700);
    	Lib.add(t);
    	
    	t=Lib.extend("적색 드래곤 가죽 손보호구","붉은 가죽 손보호구");
    	t.set("식별안된이름","붉은 가죽 손보호구");
    	t.set("방어력",12);
    	t.set("이미지",371);
    	t.set("최소레벨",23);
    	t.set("아이템무게",800);
        t.add("장비수정치",Modifier.bonus("ARM:fire",8));
    	Lib.add(t);
    	
    	t=Lib.extend("손보호구","기본 장갑");
    	t.set("이미지",372);
    	t.set("최소레벨",7);
    	t.set("방어력",4);
    	t.set("아이템무게",1500);
    	addWithVariants(t);
    	
    }

    
    private static void initLeatherArmour() {
    	Thing t;
    	
    	t=Lib.extend("기본 가죽 갑옷","기본 방어구");
    	t.set("이미지",348);
    	t.set("아이템무게",2500);
    	t.set("ARM",4);
    	t.set("최소레벨",1);
        t.set("DefaultThings","2% [IsArmourRune],2% [IsItemRune]");
    	Lib.add(t);

    	t=Lib.extend("가죽 외투","기본 가죽 갑옷");
    	t.set("이미지",347);
    	t.set("아이템무게",1500);
    	t.set("방어력",2);
    	t.set("최소레벨",1);
    	addArmour(t);
    	
    	t=Lib.extend("leather armour","기본 가죽 갑옷");
    	t.set("이미지",348);
    	t.set("아이템무게",2500);
    	t.set("방어력",5);
    	t.set("최소레벨",4);
    	addArmour(t);
    	
    	t=Lib.extend("studded leather armour","기본 가죽 갑옷");
    	t.set("이미지",351);
    	t.set("아이템무게",2800);
    	t.set("방어력",6);
    	t.set("최소레벨",7);
    	addArmour(t);
    	
    	t=Lib.extend("dragon leather armour","leather armour");
    	t.set("이미지",348);
    	t.set("아이템무게",3000);
    	t.set("방어력",25);
    	t.set("Armour:fire",25);
    	t.set("최소레벨",23);
    	addArmour(t);
    	
    	t=Lib.extend("적색 드래곤 가죽 갑옷","dragon leather armour");
    	t.set("Armour:fire",80);
    	t.set("최소레벨",26);
    	addArmour(t);
    }
    
    private static void initHeadgear() {
        Thing t;
        
        t=Lib.extend("기본 머리보호구","기본 방어구");
        t.set("장비종류", RPG.WT_HEAD);
        t.set("아이템무게", 1000);
        t.set("이미지", 323);
        Lib.add(t);
        
        t=Lib.extend("기본 왕관","기본 머리보호구");
        t.set("아이템무게", 2000);
        t.set("이미지", 425);
        Lib.add(t);
        
        t = Lib.extend("기본 헬멧", "기본 머리보호구");
        t.set("IsHelmet", 1);
        t.set("이미지", 323);
        t.set("최소레벨", 1);
        t.set("HPS", 40);
        t.set("아이템무게", 4000);
        Lib.add(t);
        
        initCaps();
    }
    
    private static void initShields() {
    	Thing t;
    	
    	t=Lib.extend("기본 방패","기본 방어구");
    	t.set("IsShield",1);
    	t.set("장비종류",RPG.WT_SECONDHAND);
    	t.set("이미지",380);
    	t.set("DSKBonus",8);
    	t.set(RPG.ST_DSKMULTIPLIER,60);
        t.set("아이템무게", 6000);
        t.set("방어력", 5);
        t.set("DefaultThings","2% [IsArmourRune],2% [IsShieldRune]");
    	Lib.add(t);
    	
    	t=Lib.extend("소형 방패","기본 방패");
        t.set("아이템무게", 4000);
    	t.set("DSKBonus",2);
    	t.set(RPG.ST_DSKMULTIPLIER,70);
    	t.set("최소레벨",1);
    	t.set("이미지",380);
        t.set("방어력", 4);
    	addWithVariants(t);
    	
    	t=Lib.extend("원형 방패","기본 방패");
        t.set("아이템무게", 2500);
    	t.set("DSKBonus",0);
    	t.set(RPG.ST_DSKMULTIPLIER,100);
    	t.set("최소레벨",3);
    	t.set("이미지",388);
        t.set("방어력", 3);
    	addWithVariants(t);
    	
    	t=Lib.extend("방패","기본 방패");
        t.set("아이템무게", 6000);
    	t.set("DSKBonus",2);
    	t.set(RPG.ST_DSKMULTIPLIER,65);
    	t.set("최소레벨",3);
    	t.set("이미지",381);
        t.set("방어력", 6);
    	addWithVariants(t);
    	
    	t=Lib.extend("대형 방패","기본 방패");
        t.set("아이템무게", 10000);
    	t.set("DSKBonus",0);
    	t.set(RPG.ST_DSKMULTIPLIER,60);
    	t.set("최소레벨",4);
    	t.set("이미지",381);
        t.set("방어력", 10);
    	addWithVariants(t);
    }
    
    private static void initCaps() {
        Thing t;
        
        t = Lib.extend("가죽 모자", "기본 헬멧");
        t.set("이미지", 320);
        t.set("장비종류", RPG.WT_HEAD);
        t.set("HPS", 24);
        t.set("방어력", 1);
        t.set("아이템무게", 2000);
        Lib.add(t);
        
        t = Lib.extend("깃챙 모자", "기본 헬멧");
        t.set("이미지", 321);
        t.set("장비종류", RPG.WT_HEAD);
        t.set("HPS", 13);
        t.set("아이템무게", 1200);
        Lib.add(t);
        
        t = Lib.extend("마법 모자", "기본 헬멧");
        t.set("식별안된이름","깃챙 모자");
        t.set("이미지", 321);
        t.set("장비종류", RPG.WT_HEAD);
        t.set("HPS", 13);
        t.set("아이템무게", 1200);
        t.set("방어력",2);
        t.set("최소레벨",10);
        t.set("DefaultThings","100% [IsArmourRune]");
        t.multiplyStat("Frequnecy",0.2);
        Lib.add(t);
        
    	t=Lib.extend("광부용 모자","기본 헬멧");
    	t.set("식별안된이름","sturdy cap");
    	t.set("이미지",324);
    	t.set("최소레벨",5);	
    	t.set("방어력",2);
    	t.set("아이템무게",2300);  
    	t.set("빈도",5);
        t.add("장비수정치",Modifier.bonus(Skill.MINING,1));
        Lib.add(t);
    }
    
    private static void addFootwear(Thing t) {
        String n=t.getString("이름");
        String un=t.getString("식별안된이름");
        if (n!=null) t.set("이름복수",n);
        if (un!=null) t.set("식별안된이름복수",un);
        Lib.add(t);
    }
    
    private static void initFootwear() {
        Thing t;
        
        t=Lib.extend("기본 신발","기본 방어구");
        t.set("장비종류", RPG.WT_BOOTS);
        t.set("IsFootwear", 1);
        t.multiplyStat("빈도",0.5);
        Weapon.setStats(t,50,0,70,0,0,0);
        t.set("무기피해종류","충격");
        t.set("타격동사","걷어차서/걷어찼지만");
        Lib.add(t);
        
        t = Lib.extend("가죽 장화", "기본 신발");
        t.set("이미지", 360);
        t.set("NameType", Describer.NAMETYPE_QUANTITY);
        t.set("HPS", 24);
        t.set("최소레벨", 5);
        t.set("아이템무게", 2800);
        t.set("기본가격",100);
        t.set("재질","leather");
        addFootwear(t);
        
        t = Lib.extend("낡은 장화", "가죽 장화");
        t.set("식별안된이름","낡은 신발");
        t.set("최소레벨", 1);
        addFootwear(t);
        
        t = Lib.extend("민첩의 장화", "가죽 장화");
        t.set("식별안된이름","낡은 신발");
        t.set("최소레벨", 6);
        t.add("장비수정치",Modifier.linear("AG",100,RPG.d(2,6)));
        addFootwear(t);
        
        t = Lib.extend("신발", "가죽 장화");
        t.set("최소레벨", 2);
        t.set("아이템무게", 1400);
        t.set("이미지", 362);
        addFootwear(t);
        
        t = Lib.extend("질좋은 신발", "신발");
        t.set("최소레벨", 12);
        t.set("아이템무게", 1200);
        t.set("이미지", 362);
        t.set("방어력",1);
        t.add("장비수정치",Modifier.bonus("CH",2));
        addFootwear(t);
        
        t = Lib.extend("무용 신발", "신발");
        t.set("최소레벨", 5);
        t.add("장비수정치",Modifier.bonus("AG",3));
        t.set("이미지", 362);
        addFootwear(t);
        
        t = Lib.extend("징박힌 신발", "가죽 장화");
        t.set("식별안된이름","iron boots");
        t.set("최소레벨", 11);
        t.set("이미지", 361);
        t.set("방어력",8);
        t.multiplyStat("아이템무게",1.5);
        Weapon.setStats(t,50,0,80,0,0,0);
        addFootwear(t);
        
        t = Lib.extend("마법 신발", "가죽 장화");
        t.set("IsMagicItem",1);
        t.set("식별안된이름","낡은 신발");
        t.add("장비수정치",Modifier.linear("이동속도",100,100));
        t.set("방어력", 4);
        t.set("최소레벨", 12);
        addFootwear(t);
        
    }

    public static void addArmour(Thing t) {
    	if (t.getStat("기본가격")==0) {
    		t.set("기본가격",t.getStat("아이템무게")/10);
    	}
    	
    	Lib.add(t);
    }
    
    // armour modifiers for each primary material
    // iron is "standard"
    private static String[] amat={"철","강철","은",   "요정 강철", "미스릴", "크리튬","검은 무쇠","푸른 무쇠", "붉은 무쇠", "수정", "파릴라이트", "청옥",         "녹옥"};
    private static String[] umat={null,  null,   "은빛",  "반짝이는",     "은빛", "어두운",    "어두운",       "은빛",     null,        "반짝이는", "반짝이는",  "푸르게 빛나는", "녹색으로 빛나는"};
    private static int[] levels= {3  ,   7 ,     9,          12,            20,        16,        22,           15,           18,          60,        28,          25,                 31};
    private static int[] weights={100,   90,     80,         70,            50,        160,       130,          80,           100,         60,        40,          65,                 60};
    private static int[] freqs=  {100,   70,     20,         50,            20,        40,        50,           50,           60,          30,        10,          20,                 10};
    private static int[] skills= {100,   105,    100,        120,           140,       80,        100,          150,          110,         140,       170,         190,                220};
    private static int[] strs=   {100,   110,    90,         120,           150,       140,       180,          140,          160,         140,       200,         210,                250};
    	
    // add variants of different metal types
    public static void addWithVariants(Thing a) {
        
        for (int i=0; i<amat.length; i++) {
            Thing t=(Thing)a.clone();
            String name=t.name();
            t.set("이름",amat[i]+" "+name);
            t.set("재질",amat[i]);
            t.set("식별안된이름", (umat[i]==null) ? name : umat[i]+" "+name);
            
            // plural for boots
            if (name.indexOf("장화")>=0) {
            	/*
                String n=t.getString("이름");
                String un=t.getString("식별안된이름");
                if (n!=null) t.set("이름복수","pairs of "+n);
                if (un!=null) t.set("식별안된이름복수","pairs of "+un);
                */
            	String n=t.getString("이름");
                String un=t.getString("식별안된이름");
                if (n!=null) t.set("이름복수", n);
                if (un!=null) t.set("식별안된이름복수", un);
            }
            
            t.multiplyStat("아이템무게",weights[i]/100.0);
            t.set("최소레벨",RPG.max(1,levels[i]+t.getStat("최소레벨")));
            t.multiplyStat("빈도",freqs[i]/100.0);
            t.multiplyStat(RPG.ST_DSKMULTIPLIER,skills[i]/100.0);
            t.multiplyStat(RPG.ST_DSKBONUS,skills[i]/100.0);
            t.multiplyStat("방어력",(strs[i]/100.0)*(strs[i]/100.0)*(strs[i]/100.0));
            t.set("HPS",t.getStat("방어력")*5);
            addArmour(t);
        } 
    }    
    
    private static void initStandardArmour() {
        
    	Thing t;
    	
    	t=Lib.extend("기본 표준 갑옷","기본 방어구");
        t.set("DefaultThings","2% [IsArmourRune],2% [IsItemRune]");
    	t.set("빈도",30);
    	Lib.add(t);
    	
    	// ARMOUR
    	t=Lib.extend("사슬 갑옷","기본 표준 갑옷");
    	t.set("이미지",349);
    	t.set("최소레벨",3);
    	t.set("방어력",10);
    	t.set("아이템무게",8000);
    	addWithVariants(t);
    	
    	t=Lib.extend("비늘 갑옷","기본 표준 갑옷");
    	t.set("이미지",350);
    	t.set("최소레벨",4);	
    	t.set("방어력",14);
    	t.set("아이템무게",11000);
    	addWithVariants(t);
    	
    	t=Lib.extend("미늘 갑옷","기본 표준 갑옷");
    	t.set("이미지",353);
    	t.set("최소레벨",5);	
    	t.set("방어력",20);
    	t.set("아이템무게",15000);
    	addWithVariants(t);
    	
    	t=Lib.extend("철판 갑옷","기본 표준 갑옷");
    	t.set("이미지",354);
    	t.set("최소레벨",6);	
    	t.set("방어력",30);
    	t.set("아이템무게",20000);
    	addWithVariants(t);
    	
    	t=Lib.extend("두꺼운 철판 갑옷","기본 표준 갑옷");
    	t.set("이미지",354);
    	t.set("최소레벨",6);	
    	t.set("방어력",40);
    	t.set("아이템무게",30000);
    	addWithVariants(t);
    	
    	t=Lib.extend("판금 갑옷","기본 표준 갑옷");
    	t.set("이미지",355);
    	t.set("최소레벨",6);	
    	t.set("방어력",60);
    	t.set("장비종류",RPG.WT_FULLBODY);
    	t.set("아이템무게",40000);
    	addWithVariants(t);
    	
    	t=Lib.extend("두꺼운 판금 갑옷","기본 표준 갑옷");
    	t.set("이미지",355);
    	t.set("최소레벨",7);	
    	t.set("방어력",80);
    	t.set("아이템무게",60000);
     	t.set("장비종류",RPG.WT_FULLBODY);
        addWithVariants(t);
        
        // HELMETS
        t=Lib.extend("기본 표준 헬멧","기본 표준 갑옷");
    	t.set("이미지",323);
    	t.set("장비종류",RPG.WT_HEAD);
    	t.set("아이템무게",3000);
    	t.set("빈도",30);
    	Lib.add(t);
        
    	t=Lib.extend("모자","기본 표준 헬멧");
    	t.set("이미지",324);
    	t.set("최소레벨",1);	
    	t.set("방어력",2);
    	t.set("아이템무게",2000);        
    	addWithVariants(t);  
    	
   	
    	t=Lib.extend("징박힌 모자","기본 표준 헬멧");
    	t.set("이미지",320);
    	t.set("최소레벨",1);	
    	t.set("방어력",3);
    	t.set("아이템무게",2200);
    	addWithVariants(t);
        
        t=Lib.extend("헬멧","기본 표준 헬멧");
    	t.set("이미지",323);
    	t.set("최소레벨",2);	
    	t.set("방어력",4);
    	t.set("아이템무게",4000); 
    	addWithVariants(t);
        
        t=Lib.extend("뿔달린 헬멧","기본 표준 헬멧");
    	t.set("이미지",330);
    	t.set("최소레벨",4);	
    	t.set("방어력",7);
    	t.set("아이템무게",6000); 
        addWithVariants(t);
        
        t=Lib.extend("가시달린 헬멧","기본 표준 헬멧");
    	t.set("이미지",329);
    	t.set("최소레벨",5);	
    	t.set("방어력",6);
    	t.set("아이템무게",4500); 
        addWithVariants(t);
        
        t=Lib.extend("커다란 헬멧","기본 표준 헬멧");
    	t.set("이미지",339);
    	t.set("최소레벨",6);	
    	t.set("방어력",10);
    	t.set("아이템무게",8000); 
    	addWithVariants(t);
        
        // Metal boots
        t=Lib.extend("기본 표준 장화","기본 신발");
        t.set("장비종류",RPG.WT_BOOTS);
        t.set("빈도",10);
        Weapon.setStats(t,50,0,70,0,0,0);
        Lib.add(t);
        
        t = Lib.extend("판금 댄 신발", "기본 표준 장화");
        t.set("최소레벨", 3);
        t.set("이미지", 361);
        t.set("방어력",2);
        t.set("아이템무게",1500);
        addWithVariants(t);
        
        t = Lib.extend("판금 댄 장화", "기본 표준 장화");
        t.set("최소레벨", 3);
        t.set("이미지", 361);
        t.set("방어력",3);
        t.set("아이템무게",3000);
        addWithVariants(t);
        
        t = Lib.extend("판금 댄 무거운 장화", "기본 표준 장화");
        t.set("최소레벨", 4);
        t.set("이미지", 361);
        t.set("방어력",5);
        t.set("아이템무게",5000);
        addWithVariants(t);
    }
}